<?
// *****************************************************************************
// Тестовый модуль my-site
// Префикс ipblacklist_
// Версия от 04.07.2006
// Автор: Алексей Дьяченко
// Библиотека распространяется по лицензии GPL
// Принять участие в разработке или скачать новую версию вы можете на сайте
// http://www.my-site.ru/
/*
	Copyright 2006 Alex Djachenko http://www.my-site.ru
	Authors:  Alex Djachenko
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
// *****************************************************************************

mst_initmod('sharpobj');

// Подключаем файл с настройками
// include mst_modpath($MT_mod_name,'cfg/config.php');

// Перечисляем переменные из $MT_mod_dat, 
// которые нужно регистрировать в окружении при запуске файла модуля
$MT_mod_envvars='Processor';

// Обьявляем функции
function ipblacklist_shell_url($filename='')
{   // Возвращаем URL внутри модуля
    // Эта функция обьявляется для модулей, используемых в качестве shell
    if(empty($filename))
    {   // Не передан путь внутри модуля, возврящаем пустую строку
        return '';
    }
    // Передан путь внутри модуля, формируем внутренний URL
    $filename_url="?Add={$filename}";
    return $filename_url;
}
function ipblacklist_check($ip)
{
	// Проверяем IP
	if (strlen($ip)==0)
	{
		return "noip";
	}
	$Processor = mst_getdatemod('ipblacklist','Processor');
	// Получаем копию контейнера для хранения IP
	$dataobj = $Processor->storageObj('bip','ip');
	// Устанавливаем ip-адрес
	$dataobj->set('form',$ip);
	// Вызываем функцию проверки
	return $Processor->act_checkip($dataobj)->get('plain');
}
class ipblacklist_processor extends sharpobj_processor
{
	function __construct()
	{
		// Создаем справочники
		// Задаем формат справочника заблокированных IP
		$format1 = new sharpobj_storage_format();
		$format1->addItem('ip','ip','row');
		$format1->addItem('addtime','addtime','int');
		$format1->addItem('count','count','int');
		// Объявляем справочник
		$DB_bip = new sharpobj_storage_simplemysql($format1,
		array('tbname'=>'ipblacklist_bip','idfield'=>'id'));
		// Добавляем справочник к процессору
		$this->storageAdd('bip',$DB_bip);
		// Задаем формат справочника заблокированных сетей
		$format2 = new sharpobj_storage_format();
		$format2->addItem('net','net','row');
		$format2->addItem('netmask','netmask','row');
		$format2->addItem('addtime','addtime','int');
		$format2->addItem('count','count','int');
		// Объявляем справочник
		$DB_bnet = new sharpobj_storage_simplemysql($format2,
		array('tbname'=>'ipblacklist_bnet','idfield'=>'id'));
		// Добавляем справочник к процессору
		$this->storageAdd('bnet',$DB_bnet);

	}
    function act_checkip($dataobj)
    {
		$result = new sharpobj_data_item_smallatword;
		// Проверяем IP по черному списку IP
		$id = $this->storageLink('bip')->sqlqueryOneValue(
				"SELECT id FROM #!table#"
				." WHERE ip='{$dataobj->get('sql')}' LIMIT 1");
		if ($id>0)
		{
			$result->set('plain','stop');
				// Обновляем счетчик
				$this->storageLink('bip')->countUp($id,'count');
			return $result;
		}
		// Проверяем по списку подсетей
		$bnetList = $this->storageLink('bnet')->getListAll();
		foreach ($bnetList as $bnet)
		{
			// echo $bnet->get('plain','ip');
			// echo $bnet->get('plain','netmask');
			if (ipblacklist_isipin($dataobj->get('plain'),
									$bnet->get('plain','net'),
									$bnet->get('plain','netmask')))
			{
				// Устанавливаем результат
				$result->set('plain','stop');
				// Обновляем счетчик
				$this->storageLink('bnet')->countUp($bnet->getId(),'count');
				return $result;
			}
		}
		$result->set('plain','ok');
		return $result;
        // return $this->storageLink('t1')->getObj();
    }
}
function ipblacklist_isipin($ip, $net, $mask)
{
   //doesn't check for the return value of ip2long
    $ip = ip2long($ip);
    $rede = ip2long($net);
    $mask = ip2long($mask);

    //AND
    $res = $ip & $mask;
    return ($res == $rede);
}
//  Обьявляем данные модуля
$MT_mod_dat['Processor'] = & new ipblacklist_processor(); 
?>
